/**
 * 图片处理工具函数
 */

/**
 * 加载图片并返回Image对象
 * @param {string} src - 图片路径
 * @returns {Promise<HTMLImageElement>}
 */
export function loadImage(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.crossOrigin = 'anonymous';
    img.onload = () => resolve(img);
    img.onerror = reject;
    img.src = src;
  });
}

/**
 * 计算图片在容器中的显示尺寸和位置（按比例撑满）
 * @param {number} imgWidth - 图片原始宽度
 * @param {number} imgHeight - 图片原始高度
 * @param {number} containerWidth - 容器宽度
 * @param {number} containerHeight - 容器高度
 * @returns {Object} 包含x, y, width, height的对象
 */
export function calculateImageBounds(imgWidth, imgHeight, containerWidth, containerHeight) {
  const imgRatio = imgWidth / imgHeight;
  const containerRatio = containerWidth / containerHeight;
  
  let displayWidth, displayHeight, x, y;
  
  if (imgRatio > containerRatio) {
    // 图片更宽，以容器宽度为准
    displayWidth = containerWidth;
    displayHeight = containerWidth / imgRatio;
    x = 0;
    y = (containerHeight - displayHeight) / 2;
  } else {
    // 图片更高，以容器高度为准
    displayHeight = containerHeight;
    displayWidth = containerHeight * imgRatio;
    x = (containerWidth - displayWidth) / 2;
    y = 0;
  }
  
  return {
    x: Math.round(x),
    y: Math.round(y),
    width: Math.round(displayWidth),
    height: Math.round(displayHeight)
  };
}

/**
 * 获取图片信息
 * @param {string} src - 图片路径
 * @returns {Promise<Object>} 包含width和height的对象
 */
export function getImageInfo(src) {
  return new Promise((resolve, reject) => {
    // H5平台使用Image对象获取图片信息
    // #ifdef H5
    const img = new Image();
    img.crossOrigin = 'anonymous';
    img.onload = () => {
      resolve({
        width: img.naturalWidth,
        height: img.naturalHeight,
        path: src
      });
    };
    img.onerror = (error) => {
      console.error('H5平台加载图片失败:', error);
      reject(error);
    };
    img.src = src;
    // #endif
    
    // 非H5平台使用uni.getImageInfo
    // #ifndef H5
    uni.getImageInfo({
      src: src,
      success: (res) => {
        resolve({
          width: res.width,
          height: res.height,
          path: res.path
        });
      },
      fail: reject
    });
    // #endif
  });
}

/**
 * 压缩图片
 * @param {string} src - 图片路径
 * @param {number} quality - 压缩质量 0-1
 * @returns {Promise<string>} 压缩后的图片路径
 */
export function compressImage(src, quality = 0.8) {
  return new Promise((resolve, reject) => {
    uni.compressImage({
      src: src,
      quality: quality,
      success: (res) => {
        resolve(res.tempFilePath);
      },
      fail: reject
    });
  });
}

/**
 * 旋转图片并返回新的base64
 * @param {string} imageSrc - 图片路径或base64
 * @param {number} rotation - 旋转角度 (0, 90, 180, 270)
 * @returns {Promise<string>} 旋转后的base64图片数据
 */
export function rotateImage(imageSrc, rotation) {
  return new Promise((resolve, reject) => {
    try {
      // H5平台使用Canvas进行旋转
      // #ifdef H5
      // 创建canvas和context
      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');
      
      // 创建图片对象
      const img = new Image();
      img.crossOrigin = 'anonymous';
      
      img.onload = () => {
        let { width, height } = img;
        
        // 根据旋转角度调整canvas尺寸
        if (rotation === 90 || rotation === 270) {
          canvas.width = height;
          canvas.height = width;
        } else {
          canvas.width = width;
          canvas.height = height;
        }
        
        // 移动到canvas中心点
        ctx.translate(canvas.width / 2, canvas.height / 2);
        
        // 旋转
        ctx.rotate((rotation * Math.PI) / 180);
        
        // 绘制图片（以中心点为原点）
        ctx.drawImage(img, -width / 2, -height / 2, width, height);
        
        // 转换为base64
        const base64 = canvas.toDataURL('image/jpeg', 0.9);
        resolve(base64);
      };
      
      img.onerror = (error) => {
        console.error('图片加载失败:', error);
        reject(error);
      };
      
      img.src = imageSrc;
      // #endif
      
      // 非H5平台暂不支持，直接返回原图
      // #ifndef H5
      console.warn('非H5平台暂不支持图片旋转，返回原图');
      resolve(imageSrc);
      // #endif
    } catch (error) {
      console.error('旋转图片失败:', error);
      reject(error);
    }
  });
}

/**
 * 将base64转换为Image对象
 * @param {string} base64 - base64图片数据
 * @returns {Promise<HTMLImageElement>}
 */
export function base64ToImage(base64) {
  return new Promise((resolve, reject) => {
    // H5平台使用Image对象
    // #ifdef H5
    const img = new Image();
    img.crossOrigin = 'anonymous';
    img.onload = () => resolve(img);
    img.onerror = reject;
    img.src = base64;
    // #endif
    
    // 非H5平台使用loadImage
    // #ifndef H5
    loadImage(base64).then(resolve).catch(reject);
    // #endif
  });
}
